package recursion

type GetApple struct {
	val map[int]int
}

// 拿苹果问题
/*
一共有N个苹果，假设小明每次可以拿1个或2个或3个
请问小明把N个苹果拿完一共有多少种拿法
*/

func NewGetApple() *GetApple {
	return &GetApple{
		map[int]int{},
	}
}

func (g *GetApple) Get(n int) int {
	if g.val[n] != 0 {
		return g.val[n]
	}

	if n == 0 {
		return 0
	} else if n == 1 {
		g.val[1] = 1
		return 1
	} else if n == 2 {
		g.val[2] = 2
		return 2
	} else if n == 3 {
		g.val[3] = 4
		return 4
	} else {
		g.val[n] = g.val[n-1] + g.val[n-2]
		return g.val[n]
	}
}

func (g *GetApple) Print(n int) int {
	return g.val[n]
}
